package com.cxc.observer;

/**
 * 观察者模式：多个订阅者、客户称之为观察者，需要同步给多个订阅者的数据封装到对象中，称之为目标
 * 广播机制的场景  网站上很多人订阅了 板块主题信息，当有这个主题信息发生变化，就会将这些
 * 新闻发给所有的订阅的人。
 * 目标对象：subject或者 Observable的状态变化时，他需要及时告知一系列的观察者对象，Observer
 * 令他们做出响应
 *
 */
public class Client {

    public static void main(String[] args) {

        ConcreateSubject subject = new ConcreateSubject();
        //创建多个观察者
        ObserverA  obs1 = new ObserverA();
        ObserverA  obs2 = new ObserverA();
        ObserverA  obs3 = new ObserverA();
        //将这三个观察者添加到subject对象的观察者队伍中
        subject.registerObserver(obs1);
        subject.registerObserver(obs2);
        subject.registerObserver(obs3);

        //改变subject的状态
        subject.setState(3000);
        System.out.println("########################");
        //我们看看，观察者的状态是不是也发生了变化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());

       //改变subject的状态
        subject.setState(30);
        System.out.println("########################");
        System.out.println("修改状态后"+obs1.getMyState());
        System.out.println("修改状态后"+obs2.getMyState());
        System.out.println("修改状态后"+obs3.getMyState());

        ConcreateOtherSubject subjectOther = new ConcreateOtherSubject();
        //创建多个观察者
        ObserverB  obsb1 = new ObserverB();
        ObserverB  obsb2 = new ObserverB();
        ObserverB  obsb3 = new ObserverB();

        //将这三个观察者添加到subject对象的观察者队伍中
        subjectOther.addObserver(obsb1);
        subjectOther.addObserver(obsb2);
        subjectOther.addObserver(obsb3);

        //改变subject的状态
        subjectOther.setState(500);
        System.out.println("########################");
        //我们看看，观察者的状态是不是也发生了变化
        System.out.println( "other:"+obsb1.getMyState());
        System.out.println("other:"+obsb2.getMyState());
        System.out.println("other:"+obsb3.getMyState());


    }
}
